package com.hrms.common.utils;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class DateUtil {

    /**
     * 方法描述: 判断该日期是否是工作日
     * @param dateTime
     * @return: Boolean
     */
    public Boolean verdictIsWorkDay(String dateTime) {
        Boolean isWorkDay = false;
        //创建时间格式
        DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd");
        String strDate = "";
        //如果dataTime不是空 则将该值转为date
        if(StringUtils.isNotEmpty(dateTime)){
            strDate = dateTime;
        }else{
            strDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        }
        //时间不能为空
        if(StringUtils.isNotEmpty(strDate)){
            //去假期补休数据库中查看是否有该天数据
            Map query = new HashMap<>(16);
            query.put("date", strDate);
            //queryDemo 根据时间匹配demo表中的date字段并且isDelete是未删除的的数据
            JSONArray demos = new JSONArray();
            //如果有今天的数据则判断holiday的值是否是false(true 是假期 false不是假期)
            if(demos.size() > 0){
                JSONObject demo = demos.getJSONObject(0);
                //如果holiday字段是false证明今天是工作日
                if("false".equals(demo.get("holiday").toString())){
                    isWorkDay = true;
                }
            }else{
                //没有数据则判断是星期几 周一到周五为工作日
                //如果只想根据周一到周五判断是不是工作日 只需要try里面的代码就行了
                try {
//                    String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(fmt.parse(strDate));
                    int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
                    if (w < 0){
                        w = 0;
                    }
                    String weekDay = "1,2,3,4,5";
                    if(weekDay.indexOf(String.valueOf(w)) != -1){
                        isWorkDay = true;
                    }else{
                        isWorkDay = false;
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        return isWorkDay;
    }

    // 获取某个月的第一天和最后一天
    public LocalDate[] getMonthRange(YearMonth yearMonth) {
        LocalDate firstDay = yearMonth.atDay(1);
        LocalDate lastDay = yearMonth.atEndOfMonth();
        return new LocalDate[]{firstDay, lastDay};
    }
    // 获取某个月的第一天
    public LocalDate getMonthFirst(YearMonth yearMonth) {
        LocalDate firstDay = yearMonth.atDay(1);
        return firstDay;
    }
    // 获取某个月的最后一天
    public LocalDate getMonthLast(YearMonth yearMonth) {
        LocalDate lastDay = yearMonth.atEndOfMonth();
        return lastDay;
    }

    // 获取上个月的最后一天
    public LocalDate getLastMonthEndDay(YearMonth yearMonth) {
        return yearMonth.minusMonths(1).atEndOfMonth();
    }

    public List<String> getDatesForMonth(String inputDate) {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // 解析输入的日期字符串为 LocalDate 对象
        LocalDate date = LocalDate.parse(inputDate, formatter);

        // 获取该日期所在月份的第一天
        LocalDate firstDayOfMonth = date.withDayOfMonth(1);

        // 计算该月有多少天
        int lengthOfMonth = date.lengthOfMonth();

        // 创建一个列表存储当月所有日期
        List<String> datesOfMonth = new ArrayList<>();

        // 循环添加每一天到列表中
        for (int i = 0; i < lengthOfMonth; i++) {
            LocalDate eachDay = firstDayOfMonth.plusDays(i);
            datesOfMonth.add(eachDay.format(formatter));
        }
        return datesOfMonth;
    }

    /**
     * 功能：获取String日期对应的时间
     * isTotal = false ;yyyy-MM-dd格式限定
     * isTotal = true ;yyyy-MM-dd hh-mm-ss格式限定
     */
    public static Date formatStringToDate(String base, Boolean isTotal) {
        String format = isTotal ? "yyyy-MM-dd hh-mm-ss" : "yyyy-MM-dd";
        DateFormat df = new SimpleDateFormat(format);
        Date baseTime;
        try {
            baseTime = df.parse(base);
        } catch (Exception e) {
            return null;
        }
        return baseTime;
    }

    /**
     * 将 Date 对象转换为 LocalTime。
     *
     * @param date 待转换的 Date 对象
     * @return 转换后的 LocalTime 对象
     */
    public static LocalTime convertToLocalTime(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("Date must not be null");
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
    }

    public static LocalTime[] findEarliestAndLatest(Date vo1, Date vo2, Date vo3) {
        LocalTime time1 = convertToLocalTime(vo1);
        LocalTime time2 = convertToLocalTime(vo2);
        LocalTime time3 = convertToLocalTime(vo3);

        // 初始化最早和最晚时间为第一个时间
        LocalTime earliest = time1;
        LocalTime latest = time1;

        // 比较第二个时间
        if (time2.isBefore(earliest)) {
            earliest = time2;
        }
        if (time2.isAfter(latest)) {
            latest = time2;
        }

        // 比较第三个时间
        if (time3.isBefore(earliest)) {
            earliest = time3;
        }
        if (time3.isAfter(latest)) {
            latest = time3;
        }

        return new LocalTime[]{earliest, latest};
    }


}
